{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1 分析用户表"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>Location</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID                            Location   Age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user = pd.read_csv('./data/BX-Users.csv',sep=';')\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 修改列名"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id                            location   age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.columns = ['user_id','location','age']\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 分析location"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "location_value_counts = df_user['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "57339"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "location_value_counts.count()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 平均每个地区，存在的用户个数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.863321648441723"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "location_value_counts.sum()/location_value_counts.count()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 把location变成国家"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_user['location'] = df_user['location'].apply(lambda location:location.rsplit(',',maxsplit=1)[-1].strip())## location从右侧切片（rsplit），分隔符是','只切一次，最后只剩国家"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location   age\n",
       "0        1             usa   NaN\n",
       "1        2             usa  18.0\n",
       "2        3          russia   NaN\n",
       "3        4        portugal  17.0\n",
       "4        5  united kingdom   NaN"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "709"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df_user['location'].unique())## 国家种类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "location_value_counts = df_user['location'].value_counts()## 每个国家包含多少用户"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "        range(len(location_value_counts)),\n",
    "        location_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    location_value_counts,\n",
    "    labels = location_value_counts.index\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 分析age"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa  NaN\n",
       "2        3          russia  NaN\n",
       "4        5  united kingdom  NaN\n",
       "6        7             usa  NaN\n",
       "7        8          canada  NaN"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user[\n",
    "    df_user['age'].isnull()\n",
    "].head()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "user_id     110762\n",
       "location    110762\n",
       "age              0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user[\n",
    "    df_user['age'].isnull()\n",
    "].count()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 278858 entries, 0 to 278857\n",
      "Data columns (total 3 columns):\n",
      " #   Column    Non-Null Count   Dtype  \n",
      "---  ------    --------------   -----  \n",
      " 0   user_id   278858 non-null  int64  \n",
      " 1   location  278858 non-null  object \n",
      " 2   age       168096 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 6.4+ MB\n"
     ]
    }
   ],
   "source": [
    "df_user.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>usa</td>\n",
       "      <td>61.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10</td>\n",
       "      <td>spain</td>\n",
       "      <td>26.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>11</td>\n",
       "      <td>australia</td>\n",
       "      <td>14.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    user_id   location   age\n",
       "1         2        usa  18.0\n",
       "3         4   portugal  17.0\n",
       "5         6        usa  61.0\n",
       "9        10      spain  26.0\n",
       "10       11  australia  14.0"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user_age_notnull = df_user[~df_user['age'].isnull()] ## ~取反\n",
    "df_user_age_notnull.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "age_value_counts_sort_by_age = df_user_age_notnull['age'].value_counts().sort_index()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAX8AAAD4CAYAAAAEhuazAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3dfXTc1X3n8fd3RqPR85Ml+UGyLQPmwdgGjHGcEmiahGBIGggtXdKT4Lbp8TksadNt9myh2Z6T7C55aLrdNm3CHhqymCaB0iZZKCcJUAc2gVBA5snYxlh+wBY2kixLtjSSZjQzd/+Y35jBjKSRNE+a+bzOmTM/3fn9Zu71yB9f39/93Z855xARkfLiK3QFREQk/xT+IiJlSOEvIlKGFP4iImVI4S8iUoYqCl2BmbS2trqurq5CV0NEZEHZuXPnCedc21SvF334d3V10d3dXehqiIgsKGb25nSva9hHRKQMKfxFRMqQwl9EpAwp/EVEypDCX0SkDCn8RUTKkMJfRKQMKfyz7MnX+9nfN1LoaoiITEvhn0XOOf74gZf43A9eIh7XfRJEpHgp/LOofyTMSDjKvr4RHt11vNDVERGZksI/iw70jwJQHfDzN//2BtFYvMA1EhFJT+GfRQcGEuH/Z1su4OBAiIdfPlbgGomIpKfwz6IDAyFqK/3c+v4u1ixt4G937FfvX0SKksI/iw4MjHJOWx0+n7Ht6nM4cnKMvcc180dEio/CP4sODoQ4t60WgCtWtQDw4pGhQlZJRCQthX+WjEdivDU8zrltdQAsa6yivT7ISwp/ESlCCv8sOXZqHIDlLTUAmBmXrWjipaPDhayWiEhaCv8sCYWjANRXvXNztMtWNPPm4BiDo+FCVUtEJC2Ff5aMeuFfU5kS/subAHj0VV3wJSLFReGfJWPhGAC1Qf+ZsstXNvNr5y7iy/+6m5/qil8RKSIK/ywJRRI9/9rgOz3/Cr+Pe7dewSXLm/izH75K3+mJQlVPRORdFP5ZEkr2/FOGfQCqK/389e9cSiQW57/9655CVE1E5D0U/lky5vX8a1KGfZJWtdZy/dqlvKyZPyJSJBT+WZI84Xt2zz+ppbaS4bFIPqskIjIlhX+WjEViVAV8+H2W9vXG6gChSIxIVGv9iEjhKfyzJBSOTtnrB2iqCQBwanwyX1USEZmSwj9LQuHou2b6nK2xphKAU+Ma+hGRwlP4Z0koEqOm8r0ne5OaqhM9/+Ex9fxFpPAU/lkSCkepm6bnnxz2UfiLSDHIKPzN7LCZ7TKzl82s2ytrMbMnzGy/99ycsv+dZtZjZvvM7NqU8su99+kxs2+aWfqzowtQKBKjZrphn2qN+YtI8ZhNz/83nHOXOuc2ej/fAexwzq0Gdng/Y2ZrgFuAi4EtwLfNLDkecjewDVjtPbbMvwnFYSwcpXbaYZ/EmP+wwl9EisB8hn1uALZ729uBG1PKH3TOhZ1zh4AeYJOZLQUanHPPOucccH/KMQveTCd866sqMINTmusvIkUg0/B3wONmttPMtnlli51zxwG853avvAM4mnJsr1fW4W2fXf4eZrbNzLrNrHtgYCDDKhZWKBKbtufv8xmN1QH1/EWkKEzdVX23K51zx8ysHXjCzF6fZt904/humvL3Fjp3D3APwMaNG9PuU2zGItFpx/whMeNHJ3xFpBhk1PN3zh3znvuBHwObgD5vKAfvud/bvRdYnnJ4J3DMK+9MU77ghaMxJmNu2tk+gHr+IlI0Zgx/M6s1s/rkNvBR4DXgEWCrt9tW4GFv+xHgFjMLmtkqEid2n/eGhkbMbLM3y+fWlGMWtORa/tPN84fEhV4a8xeRYpDJsM9i4MferMwK4AfOuZ+Z2QvAQ2b2WeAIcDOAc263mT0E7AGiwO3OuZj3XrcB9wHVwE+9x4J3ZlG3DIZ9jgyG8lElEZFpzRj+zrmDwCVpygeBD09xzF3AXWnKu4G1s69mcRuLpF/L/2xNNRr2EZHioCt8syA0zVr+qZqqA5wanyQeXxDnsEWkhCn8syDkDfvMeMK3phLnYGgswie//Qzf3LE/H9UTEXkPhX8WhDI84bt2WQMA9z59iJeODPMPvzx45nyBiEg+KfyzIHkLx5nG/Dd2tbCotpJ7fnEQgJGJKD/c2TvtMSIiuaDwz4ITo2EAmmsrp93P7zM+ctFionHHxpXNXLaiiW892UP/6Yl8VFNE5AyFfxYcOTlGY3XgzMqd09mydgkA16xZzF03rmM0HGXbP+7USWARySuFfxYcPTnO8pbqjPa9+vw2/vuNa/nd961gzbIG/vSa83n56DDH1fsXkTxS+GfB0aExljfXZLSv32d8ZvNK6qsS/0tY3pI4biikK39FJH8U/vMUjzt6T46fCfHZavHOEwxp2QcRySOF/zz1j4SJxOJzDv9m7/aOJ9XzF5E8UvjP09GhMQCWN2c25n+25hrvDl9a6llE8kjhP09HBr3wn2PPv7E6gJl6/iKSXwr/eTo6NIYZdDTNredf4ffRWB3QmL+I5JXCf556h8Zprw9SFZh+aYfptNRUqucvInml8J+nvtMTLGmcW68/qbm2Uj1/Eckrhf88DYyEaasLzus9mmsqORnSCV8RyR+F/zydGA3TVj+/8G+pDegiLxHJK4X/PERjcQZDkXmHf3NtJSfHIjin9X1EJD8U/vNwMhTBOeYf/jWVRKLxM7eDFBHJNYX/PPSPJJZynu+Yf0uNlngQkfxS+M/DgLeOfzaGfQCGdNJXRPJE4T8PA17Pvz0LJ3wBTqrnLyJ5ovCfh2T4t85z2Cd5vO7oJSL5ovCfh4GRMPXBCqpnuHH7TJY0VgFw/JTCX0TyQ+E/DwNZmOMPEKzw01Yf5NjweBZqJSIyM4X/PAyMhGnNQvgDLGuq5i2Fv4jkScbhb2Z+M3vJzB71fm4xsyfMbL/33Jyy751m1mNm+8zs2pTyy81sl/faN83Mstuc/BoYyU7PH6CjqUo9fxHJm9n0/D8P7E35+Q5gh3NuNbDD+xkzWwPcAlwMbAG+bWbJQfG7gW3Aau+xZV61L6DeoTEOnQhx8bKGrLzfssZqjg1P6CpfEcmLjMLfzDqBjwHfSSm+AdjubW8Hbkwpf9A5F3bOHQJ6gE1mthRocM496xIJd3/KMQvOT3YdB+Dj65Zl5f2WNVUzPhnTHb1EJC8y7fn/DfBfgHhK2WLn3HEA77ndK+8Ajqbs1+uVdXjbZ5e/h5ltM7NuM+seGBjIsIr59eirx1nf2ciKRXO7g9fZlnk3g9G4v4jkw4zhb2YfB/qdczszfM904/humvL3Fjp3j3Nuo3NuY1tbW4Yfmz9vn5rg1d5TfGzd0qy9Z/JOYBr3F5F8qMhgnyuBT5jZ9UAV0GBm3wP6zGypc+64N6TT7+3fCyxPOb4TOOaVd6YpX3D2948AsL6zKWvvuawpMddf4S8i+TBjz985d6dzrtM510XiRO7PnXOfBh4Btnq7bQUe9rYfAW4xs6CZrSJxYvd5b2hoxMw2e7N8bk05ZkE5fCIEwKrW2qy9Z0ttJcEKH8d0oZeI5EEmPf+pfA14yMw+CxwBbgZwzu02s4eAPUAUuN05l1yr+DbgPqAa+Kn3WHAOnghRHfCzuCE70zwBzIwOzfUXkTyZVfg7554CnvK2B4EPT7HfXcBdacq7gbWzrWSxOXwiRFdrLdm+TGFZU7WGfUQkL3SF7xwcHhxjVWt2ZvmkWqYLvUQkTxT+sxSNxTl6coyuRdkb709a1lRN/0iYSDQ+884iIvOg8J+l3qFxonFHVxZP9iYta6rGOejT0s4ikmMK/1k6NJiY6XNODsK/Qxd6iUieKPxn6fhwolfe0Vyd9fdepgu9RCRPFP6zNBpOrL1TXxXI+nsvbdSFXiKSHwr/WRqdiGIGNYH53b0rnaqAn9a6St4a1pi/iOSWwn+WRsJR6ior8PlycysCzfUXkXxQ+M/S6ESUuqr5XBg9vc7mat70TiqLiOSKwn+WRsNR6oK5C/+LlzVyeHCMU+Na119EckfhP0uj4dz2/Nd3NgKwq/dUzj5DREThP0sjE7nt+a/vSCwT/UrvcM4+Q0RE4T9LoXCU+hz2/BtrAnQtqlHPX0RySuE/S7ke84fETWJeVc9fRHJI4T9LoxNR6oLZv8Ar1frORo6dmmBgJJzTzxGR8qXwn4V43DEaye0JX3jn9pDq/YtIrij8Z2FsMoZzUJ/jYZ+1HQ34DF7RuL+I5IjCfxZGJ6IAOe/511RWsLq9Xj1/EckZhf8sJBd1y/UJX0iM++/qPYVzLuefJSLlR+E/CyPJnn+ewn8wFNHa/iKSEwr/WRgN52fYB+DS5c0A/PvBkzn/LBEpPwr/WRjNY89/bUcDXYtq+Ofuozn/LBEpPwr/WRgJ5y/8zYzfuWI5zx06ycGB0Zx/noiUF4X/LCR7/rlc3iHVb2/oxO8z/u9Lb+Xl80SkfCj8ZyE55l+bh54/QHtDFee11bH72Om8fJ6IlI8Zw9/MqszseTN7xcx2m9mXvfIWM3vCzPZ7z80px9xpZj1mts/Mrk0pv9zMdnmvfdPMcnM7rBwZDUepCvgI+PP3b+Z57XX0aNhHRLIskxQLAx9yzl0CXApsMbPNwB3ADufcamCH9zNmtga4BbgY2AJ828ySN7y9G9gGrPYeW7LYlpxLLOqW23V9znZuex1HT44xMRnL6+eKSGmbMfxdQrLrGfAeDrgB2O6Vbwdu9LZvAB50zoWdc4eAHmCTmS0FGpxzz7rElUv3pxyzIJwan6QhT+P9Savb64g7OHRCt3YUkezJaPzCzPxm9jLQDzzhnHsOWOycOw7gPbd7u3cAqfMTe72yDm/77PIFY3gsQnNtZV4/87z2OgB6+jX0IyLZk1H4O+dizrlLgU4Svfi10+yebhzfTVP+3jcw22Zm3WbWPTAwkEkV8+JkaJLmmvwO+6xqrcVnsF/hLyJZNKszl865YeApEmP1fd5QDt5zv7dbL7A85bBO4JhX3pmmPN3n3OOc2+ic29jW1jabKubU8FiEppr89vyrAn6Wt9RwQOEvIlmUyWyfNjNr8rargY8ArwOPAFu93bYCD3vbjwC3mFnQzFaROLH7vDc0NGJmm71ZPremHLMgDI1FaMnzsA/A6vZ6Xn9b0z1FJHsyOXu5FNjuzdjxAQ855x41s2eBh8zss8AR4GYA59xuM3sI2ANEgdudc8mpKrcB9wHVwE+9x4IwHokxMRmnKc/DPgCXLm/k3/b2cWpsksYCfL6IlJ4Zw9859ypwWZryQeDDUxxzF3BXmvJuYLrzBUVraCwCQEueh30ANqxIXELx0tEhPnhB+wx7i4jMTFf4ZigZ/vke8we4ZHkTPoOn9g3wPx7dQ9/pibzXQURKS34nrS9gQ6HEjVzyPdsHEstJXLCkgft+dRiA4fFJ/urmS/JeDxEpHer5Z+jMsE8BTvgCbFiRuKl7a12QH73Yq4u+RGReFP4ZKuSwD8BNGzr46JrF/PC291Ph8/HA80cKUg8RKQ0a9slQctinELN9AC5f2cI9t7YAsHpxHfveHilIPUSkNKjnn6GhsQj1VRV5XdFzKue112m5BxGZl8In2QIxNBahuUBDPmc7t62Ot4bHGY9opU8RmRuFf4aGxvK/rs9Ukou9HdA6/yIyRwr/DBViRc+pnNum8BeR+VH4Z+jESLggV/em09Vag8/QYm8iMmea7ZOBU2OTHDs1wXmL6wpdFQCCFX5WtNTw2O4+wtE4H1+/jHWdjYWulogsIOr5Z2D38VMAXLyseAJ2fWcT+/pGuPfpQ3ziW0/z4pGhQldJRBYQhX8G9hxLLKd88bKGAtfkHd+4eT0v/cU1PHPHh3AOXjh0kreGx3lzUFf+isjMNOyTgd3HTrOkoYrWumChq3JGsMJPsMIPwOKGIPv6RnjqoVfoG5ng51/4YGErJyJFT+GfgdfeOlVUvf6znb+4nj3HTnPoRIhwNM7BgVHOaSuO8xMiUpw07DOD8UiMAwOjRR3+Fyyu5/W3RwhH4wD8/PX+GY4QkXKn8J/BW8NjxB2c2168Penzl9Sf2V7cEGTHXoW/iExP4T+DwdHEap5tRTTef7YLFifCv6Opmps2dPLC4ZOMTEwWuFYiUswU/jMYDHnr+NcVxwVe6az2rj+4fGUzv35+G9G449kDgwWulYgUM4X/DAZHwwAsqi3enn9NZQVf/sTFbLv6HDasaKam0s8v958odLVEpIhpts8MToxGMCvM7RtnY+uvdZ3Z3nzOIp7uUfiLyNTU85/BYChMc00lFUWwjn+mrlrdyqETIY6eHCt0VUSkSC2cRCuQwdEIi4pkNc9MXbW6DUBDPyIyJYX/DAZDkYLdtH2uzm2rZVljFb/cPwBAPO444Z27EBEBhf+MBkfDRbWsQybMjKtWt/FMzwmisTh/+dg+PviNp5iY1J2/RCRB4T+DwVCERUU8zXMqV53fyumJKI/v6eO7zxxiNBzVOQAROWPG8Dez5Wb2pJntNbPdZvZ5r7zFzJ4ws/3ec3PKMXeaWY+Z7TOza1PKLzezXd5r3zQzy02zsmMyFmd4bLKop3lO5cpzWzGDzz/4EhFv2YfDgwp/EUnIpOcfBb7gnLsI2AzcbmZrgDuAHc651cAO72e8124BLga2AN82M7/3XncD24DV3mNLFtuSdUPeBV4LseffXFvJ3/yHS/ntyzv58+svBODwCS33LCIJM4a/c+64c+5Fb3sE2At0ADcA273dtgM3ets3AA8658LOuUNAD7DJzJYCDc65Z51zDrg/5ZiidMJb2qF1AYY/wA2XdvDVm9az7epzaaoJcFhr/YuIZ1Zj/mbWBVwGPAcsds4dh8Q/EEC7t1sHcDTlsF6vrMPbPrs83edsM7NuM+seGBiYTRWz6mRyaYcFOOxztpWLanlTwz4i4sk4/M2sDvgh8CfOudPT7ZqmzE1T/t5C5+5xzm10zm1sa2vLtIpZNxhKTI9caFM90+laVKOev4ickVH4m1mARPB/3zn3I6+4zxvKwXtOriPcCyxPObwTOOaVd6YpL1qhcGJqZF1w4a+CsXJRLceGxwlHNd1TRDKb7WPAvcBe59xfp7z0CLDV294KPJxSfouZBc1sFYkTu897Q0MjZrbZe89bU44pSsmgrAos/BmxXYtqiDvoHRonHnckTruISLnKpEt7JfAZYJeZveyV/TnwNeAhM/sscAS4GcA5t9vMHgL2kJgpdLtzLtndvA24D6gGfuo9itbEZGKKZPJeuQtZV2stAAcHQvz9z3uYjMX5+9/dUOBaiUihzBj+zrmnST9eD/DhKY65C7grTXk3sHY2FSykZM8/WLHwe/7nL67HDPYeP80v9w8syGsXRCR7Fv5gdg5NTMap9Pvw+Yr6WrSM1AUr6FpUy1P7+jkxGqHCt/D/QRORuVMCTCMcjREsgfH+pIuW1vPikWEATus2jyJlrXSSLQcmJuMlMd6ftGZpw5ntsUiMyVi8gLURkUJS+E8jHI2VxEyfpItSwh/g9Lh6/yLlqnSSLQfCk3GqAiXU81+WCP+AP3EO4/REtJDVEZECUvhPIxyNlcRMn6QlDVVct3YJv7Uhca3dKfX8RcpW6SRbDkyUWM/fzLj705fzW5cnwl/DPiLlS+E/jVLr+Sc1VgcAzfgRKWell2xZVGo9/6SGqkT4a9hHpHwp/KdR8j3/cZ3wFSlXpZdsWVSqPf+qgI+A3zTsI1LGFP7TKNWev5nRWB3QsI9IGSu9ZMuiUu35Q2LcX7N9RMqXwn8apdrzB2hQz1+krJVmsmWBcy6xtk+p9vyrA7rCV6SMKfynEIklb+RSmn9EjdUBRtTzFylbpZlsWZC8i1fpjvlXaNhHpIwp/KdQSnfxSic520f38hUpT6WZbFkQLvGe/8pFNUTjjtffHil0VUSkABT+Uyj1nv+HLlyMGTy+u6/QVRGRAijNZMuCUh/zb6sPcvmKZh7b/XahqyIiBaDwn8LEZGn3/AGuvXgJe46f5ujJsUJXRUTyrHSTbZ7C0dLu+QNct24JPoPvP3ek0FURkTxT+E+hHHr+nc01bFm7hB889yajYV3wJVJOSjfZ5qkcev4Af3jVOZyeiPLP3UcLXRURySOF/xTKoecPsGFFM5csb+IHzx3RnH+RMjJjspnZd82s38xeSylrMbMnzGy/99yc8tqdZtZjZvvM7NqU8svNbJf32jfNzLLfnOwpl54/wO9uWs7+/lF2vjlU6KqISJ5k0q29D9hyVtkdwA7n3Gpgh/czZrYGuAW42Dvm22aWTM+7gW3Aau9x9nsWlWTPvypQ2j1/gI+vX0ZdsIIHntfQj0i5mDHZnHO/AE6eVXwDsN3b3g7cmFL+oHMu7Jw7BPQAm8xsKdDgnHvWJcYW7k85pigle/7BitLv+dcGK/jIRe38Yv+Ahn5EysRcu7WLnXPHAbzndq+8A0jtPvZ6ZR3e9tnlaZnZNjPrNrPugYGBOVZxfsplzD/pilUtDIyEOaI5/yJlIdvJlm4c301TnpZz7h7n3Ebn3Ma2trasVW42wtE4lX4fPl9Rn5rImiu6WgB44bDG/UXKwVzDv88bysF77vfKe4HlKft1Ase88s405UVrYjJGsAzG+5POa6ujsTpA9+GzR/hEpBTNNd0eAbZ621uBh1PKbzGzoJmtInFi93lvaGjEzDZ7s3xuTTmmKIWj8bIY70/y+YyNK5t5QeEvUhYymer5APAscIGZ9ZrZZ4GvAdeY2X7gGu9nnHO7gYeAPcDPgNudczHvrW4DvkPiJPAB4KdZbktWjUdiVFeWT88fYPM5izgwEOLAwGihqyIiOVYx0w7OuU9N8dKHp9j/LuCuNOXdwNpZ1a6ARsNRaitn/OMpKTdctoyv/+x1Hnz+CF/82JpCV0dEcqi8urazEApHqQuWV/i311dxzZrF/MvO3jP3MxCR0qTwn0IoHKWuqrzCH+CWTSsYGpvkydf7Z95ZRBYshf8URsJRasus5w/wa+cuoqkmwGO6w5dISVP4TyEUjlJXZmP+AAG/j2suWsy/7e0j4l3lLCKlR+E/hVA4VpY9f4Ata5cwMhHl2YODha6KiOSIwj+NeNwxWqZj/gBXntdKfbCCH7/YO/POIrIgKfzTGPPW9akLls9FXqmqAn5u2tDBT3a9zeBouNDVEZEcUPinEfJuaViuwz4An968kkgszj/pDl8iJUnhn0byfrblNs8/1erF9XzgvFb+91MHOKqVPkVKjsI/jdEJr+dfhrN9Un3lk+twDv7ogZeIx7XOv0gpUfinkRz2KdcTvkkrFtXwF7+5hpePDvP/3ijMfRVEJDcU/mlo2Ocdn7ysgyUNVfzDLw8WuioikkUK/zRGdcL3jIDfx+9d2cWvDgzy5D4t+SBSKkoy/J1zvP72aV5769Scjn9ntk95TvU822c2r+SipQ38x++9yKu9w4WujohkQUmGv5mx7f6d/K8n3pjT8aPhxDz/+mAgm9VasGqDFWz/gytorgnwn/7p5TP3NxaRhaskwx/g189v41cHBue0NHEoHMVnUFVGt3GcSXt9FV+5aR0HBkJ868meQldHROapZNPt189vY3wyxs453JB81FvRM3HHSUn64AXt3LShg7ufOsDe46cLXR0RmYeSDf/3n7uIgN/mNEVxtAxv5JKpv/jYGhqrA3zhoVcYCkUKXR0RmaOSDf/aYAUbV7bMKfzL8S5emWqureQbN6+nZ2CUT3zrafpPTxS6SiIyByUb/gDvO6eFfX0jZ6ZuZmq0TG/kkqkPXbiYB7dtpu9UmL98bF+hqyMic1DS4b+uoxHnmPX4tIZ9ZrZhRTO//4Eu/mVnL7/qOVHo6ojILJV0+K/taASY9Xz/UDiqOf4Z+NxvnMfylmo+fe9zfP1nrxMrsvV/nHM8+uoxRiYmC10VkaJT0uHfXh+ktS7IrlmE/9unJjg8OEZHU00Oa1Ya6qsC/OSPr+Lmy5dz91MHuO17O4vqH4A9x0/zuR+8xD+9oGWpRc5W0uFvZqzraGD3W5kP+9z9VA/xuOP3r+zKXcVKSH1VgK//9nq+eP1FPL6nj3t+UTxrAD3jDUfN9UpvkVJW0uEPiaGf/f0jjEdmvthr55tDPPD8UW7e2MnyFvX8Z+MPr1rF9euW8FeP7+M3/+5pfvba8UJXiad7Evcg3qNrEkTeo+TDf2NXC3EHP5zhfrRP7Onj9777PMuaqvjTay7IU+1Kh5nx1ZvW8wdXdhGJxrnt+y/ypUd286sDJ4hE43mvTzga44VDJ6nwGQcGQlqSQuQseZ/SYmZbgL8F/MB3nHNfy+XnXb26lfetauEbj+3jwxe1s7Sx+sxr4WiMv9vRw892v01P/ygXLK7n//z+FbTVB3NZpZLVWB3gix9bwxc+GuPPf7SL7/37m9z3q8PUBSv42LqlXLi0niu6Ws6ciM+lFw4NMT4Z46YNHfzoxbd4o2+E9Z1NOf9ckYXCnMvfCToz8wNvANcAvcALwKecc3umOmbjxo2uu7t7Xp/7Rt8IH/+7pzHgshVNLGmoYnlLDU/s6eP1t0e4+vw2PnJRO5/atIKAv+T/M5Q3IxOTPHtgkMf39PGTXccZ84befuOCNlrrgtQGK1jSWMXaZY1cuqKJSr8Pv8/wWeJ/EsNjEXr6R6ms8DE0Nsmi2krWLG3A50u/7IZzjkgsjnNw47eeYTAU4f4/2MR1f/tLvnrTOj61aUXW2uacY2IyzmQ8Tl1lxZR1EikUM9vpnNs45et5Dv/3A19yzl3r/XwngHPuq1Mdk43wBzg4MMp3nj7E/r4Rjpwco+90mAuX1PMnHzmfLWuXzPv9ZXrRWJyToQj3PnOIJ/b0MR6JMRqOMjKR/gI8v8/SzhyqC1bQWldJzDki0TjRmCPmHNGYYywSJe7AZxB38N3f28gHz2/nki8/ngjpYAV1wQrGJ2P4zQgG/PgMnIO4S7zPyESU8GScqoCPsUiMgN9HVcBPVcBHwO9jLBJlLBwj5H1Wsq7BCh/BCh+VyYffd2ZtqOTfsXe1xr13M/Xv4jtlqfu988Nk1DE8HsFvduYzgxV+An7DpzWpSsajf/wBghVzm3Y+U/jne9inA0idd9cLvO/sncxsG7ANYMWK7PTWzmmr4yufXAck/pKFo3GqAprLn28ESRAAAASzSURBVC8Vfh/tDVXced1F3HndRWfKT41PsvPNk7zRN0os7ojFHdG4Ix531AYruHBJPbG4o7EmwJHBMXa9dYoTo2EC/kTAVviNCp/h9/moqUyEdCgSY1lTNR+6cDEA//XjF/Hy0VOYwchElOqAj7iDSDROLO7wef/b8JlRF6wgWOEjHI1TXeknGnOMT8YIT8aIxOLUVPqpDVZQW1lBbbCCCp8xPB5hYjJOJOo9YvH3nuewdz0ltlNC2s6UveeQd+2bLKvwG001lcTi7sznhqMxJmPuXf9IyMJm5O4f8nz3/G8GrnXO/aH382eATc65P5rqmGz1/EVEyslMPf98D3D3AstTfu4EjuW5DiIiZS/f4f8CsNrMVplZJXAL8Eie6yAiUvbyOubvnIua2eeAx0hM9fyuc253PusgIiIFmOfvnPsJ8JN8f66IiLxDk9pFRMqQwl9EpAwp/EVEypDCX0SkDOX1Iq+5MLMB4M05Ht4KlOM9Bsu13VC+bVe7y89MbV/pnGub6sWiD//5MLPu6a5wK1Xl2m4o37ar3eVnvm3XsI+ISBlS+IuIlKFSD/97Cl2BAinXdkP5tl3tLj/zantJj/mLiEh6pd7zFxGRNBT+IiJlqCTD38y2mNk+M+sxszsKXZ9cM7PDZrbLzF42s26vrMXMnjCz/d5zc6HrOV9m9l0z6zez11LKpmynmd3p/Q7sM7NrC1Pr7Jii7V8ys7e87/1lM7s+5bWSaLuZLTezJ81sr5ntNrPPe+Ul/b1P0+7sfefOuZJ6kFgq+gBwDlAJvAKsKXS9ctzmw0DrWWV/Cdzhbd8BfL3Q9cxCO68GNgCvzdROYI333QeBVd7vhL/Qbchy278E/Oc0+5ZM24GlwAZvux54w2tfSX/v07Q7a995Kfb8NwE9zrmDzrkI8CBwQ4HrVAg3ANu97e3AjQWsS1Y4534BnDyreKp23gA86JwLO+cOAT0kfjcWpCnaPpWSabtz7rhz7kVvewTYS+Je4CX9vU/T7qnMut2lGP7pbhI/3R9aKXDA42a208y2eWWLnXPHIfGLBLQXrHa5NVU7y+X34HNm9qo3LJQc+ijJtptZF3AZ8Bxl9L2f1W7I0ndeiuGf7nb3pT6f9Urn3AbgOuB2M7u60BUqAuXwe3A3cC5wKXAc+J9eecm13czqgB8Cf+KcOz3drmnKFmzb07Q7a995KYZ/2d0k3jl3zHvuB35M4r97fWa2FMB77i9cDXNqqnaW/O+Bc67PORdzzsWBf+Cd/+aXVNvNLEAiAL/vnPuRV1zy33u6dmfzOy/F8C+rm8SbWa2Z1Se3gY8Cr5Fo81Zvt63Aw4WpYc5N1c5HgFvMLGhmq4DVwPMFqF/OJMPP80kS3zuUUNvNzIB7gb3Oub9Oeamkv/ep2p3V77zQZ7VzdKb8ehJnxw8AXyx0fXLc1nNInOV/BdidbC+wCNgB7PeeWwpd1yy09QES/9WdJNHT+ex07QS+6P0O7AOuK3T9c9D2fwR2Aa96f/mXllrbgQ+QGL54FXjZe1xf6t/7NO3O2neu5R1ERMpQKQ77iIjIDBT+IiJlSOEvIlKGFP4iImVI4S8iUoYU/iIiZUjhLyJShv4/sisgwzioiNEAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    age_value_counts_sort_by_age.index,\n",
    "    age_value_counts_sort_by_age\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [],
   "source": [
    "def divide_age(age):\n",
    "    \"\"\"\n",
    "    :return:\n",
    "        Nan,0-6,>100  --> 0 年龄填写有误\n",
    "        7 - 12        --> 1 少儿\n",
    "        13 - 17       --> 2 青少年\n",
    "        18 - 45       --> 3 青年\n",
    "        46 - 69       --> 4 中年\n",
    "        70 - 100      --> 5 老年\n",
    "    \"\"\"\n",
    "    if np.isnan(age) or (age <=6 ) or (age > 100):\n",
    "        return 0\n",
    "    if age >= 7 and age <= 12:\n",
    "        return 1\n",
    "    if age >= 13 and age <= 17:\n",
    "        return 2\n",
    "    if age >= 18 and age <= 45:\n",
    "        return 3\n",
    "    if age >= 46 and age <= 69:\n",
    "        return 4\n",
    "    if age >= 70 and age <= 100:\n",
    "        return 5\n",
    "df_user['age'] = df_user['age'].apply(divide_age)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa    0\n",
       "1        2             usa    3\n",
       "2        3          russia    0\n",
       "3        4        portugal    2\n",
       "4        5  united kingdom    0"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 分析年龄段"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    df_user['age'].value_counts().sort_index(),\n",
    "    labels = ['undefined','shaoer','qingshaonian','qingnian','zhongnian','laonian']\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 分析打分表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [],
   "source": [
    "#### 读取数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>ISBN</th>\n",
       "      <th>Book-Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID        ISBN  Book-Rating\n",
       "0   276725  034545104X          0.0\n",
       "1   276726  0155061224          5.0\n",
       "2   276727  0446520802          0.0\n",
       "3   276729  052165615X          3.0\n",
       "4   276729  0521795028          6.0"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating = pd.read_csv('./data/BX-Book-Ratings.csv',sep=';')\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X     0.0\n",
       "1   276726  0155061224     5.0\n",
       "2   276727  0446520802     0.0\n",
       "3   276729  052165615X     3.0\n",
       "4   276729  0521795028     6.0"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.columns = ['user_id','item_id','rating']\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1149780 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype  \n",
      "---  ------   --------------    -----  \n",
      " 0   user_id  1149780 non-null  int64  \n",
      " 1   item_id  1149780 non-null  object \n",
      " 2   rating   1149772 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 26.3+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 删除有误数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype  \n",
      "---  ------   --------------    -----  \n",
      " 0   user_id  1149772 non-null  int64  \n",
      " 1   item_id  1149772 non-null  object \n",
      " 2   rating   1149772 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 35.1+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating = df_rating.dropna()\n",
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 用户活跃度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "user_value_counts = df_rating['user_id'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    range(len(user_value_counts)),\n",
    "    user_value_counts\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 商品的流行程度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "item_value_counts = df_rating['item_id'].value_counts()\n",
    "plt.plot(\n",
    "    range(len(item_value_counts)),\n",
    "    item_value_counts\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype  \n",
      "---  ------   --------------    -----  \n",
      " 0   user_id  1149772 non-null  int64  \n",
      " 1   item_id  1149772 non-null  object \n",
      " 2   rating   1149772 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 35.1+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype \n",
      "---  ------   --------------    ----- \n",
      " 0   user_id  1149772 non-null  int64 \n",
      " 1   item_id  1149772 non-null  object\n",
      " 2   rating   1149772 non-null  int32 \n",
      "dtypes: int32(1), int64(1), object(1)\n",
      "memory usage: 30.7+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating['rating'] = df_rating['rating'].astype(int)## 打分类型改为int\n",
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "## 合并用户表和打分表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa    0\n",
       "1        2             usa    3\n",
       "2        3          russia    0\n",
       "3        4        portugal    2\n",
       "4        5  united kingdom    0"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X       0\n",
       "1   276726  0155061224       5\n",
       "2   276727  0446520802       0\n",
       "3   276729  052165615X       3\n",
       "4   276729  0521795028       6"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data = pd.merge(\n",
    "    df_user,\n",
    "    df_rating,\n",
    "    on='user_id',\n",
    "    how='inner',## 两个表都有的数据才合并\n",
    ")\n",
    "df_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149771\n",
      "Data columns (total 5 columns):\n",
      " #   Column    Non-Null Count    Dtype \n",
      "---  ------    --------------    ----- \n",
      " 0   user_id   1149772 non-null  int64 \n",
      " 1   location  1149772 non-null  object\n",
      " 2   age       1149772 non-null  int64 \n",
      " 3   item_id   1149772 non-null  object\n",
      " 4   rating    1149772 non-null  int32 \n",
      "dtypes: int32(1), int64(2), object(2)\n",
      "memory usage: 48.2+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149771\n",
      "Data columns (total 5 columns):\n",
      " #   Column    Non-Null Count    Dtype \n",
      "---  ------    --------------    ----- \n",
      " 0   user_id   1149772 non-null  int64 \n",
      " 1   location  1149772 non-null  object\n",
      " 2   age       1149772 non-null  int32 \n",
      " 3   item_id   1149772 non-null  object\n",
      " 4   rating    1149772 non-null  int32 \n",
      "dtypes: int32(2), int64(1), object(2)\n",
      "memory usage: 43.9+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data['age'] = df_data['age'].astype(int)\n",
    "df_data.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 保存表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [],
   "source": [
    "import _pickle as cPickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [],
   "source": [
    "cPickle.dump(\n",
    "    df_data,\n",
    "    open('./data/Ydf_data.pkl','wb')\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [],
   "source": [
    "object1 = cPickle.load(\n",
    "    open('./data/Ydf_data.pkl','rb')\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "object1.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
